#pragma once
#include "QvObject.h"
#include "QvDataArray.h"

/*
    QvMd5 myMd5;
    myMd5.Init();
    myMd5.Update((QvUByte*)"0123456789", 10);
    myMd5.Update((QvUByte*)"abcdefg", 7);
    QvDataArray<QvByte>* md5Data = myMd5.Final();
    md5Data->Release();

    QvMd5 myMd5;
    myMd5.Init();
    QvDataArray<QvByte> data("0123456789abcdefg", 17);
    myMd5.Update(&data);
    QvDataArray<QvByte>* md5Data = myMd5.Final();
    md5Data->Release();
*/
class QvToolkit_Export QvMd5 : public QvObject
{
public:
    QvMd5();
    virtual ~QvMd5();

    void Init();
    void Update(QvDataArray<QvByte>* input);
    void Update(QvDataArray<QvUByte>* input);
    void Update(const QvUByte *input, QvUInt32 inputLen);
    QvDataArray<QvByte>* Final();

private:
    /* MD5 context. */
    typedef struct {
        QvUInt32  state[4]; /* state (ABCD) */
        QvUInt32  count[2]; /* number of bits, modulo 2^64 (lsb first) */
        QvUByte buffer[64]; /* input buffer */
    } MD5_CTX;

    MD5_CTX context;
};
